package objectOriented;

public class MethodTypes {
    // 实例变量（成员变量）
    private String name;
    private int age;
    
    // 静态变量（类变量）
    private static String school = "清华大学";
    
    // 构造方法特点：
    // 1. 方法名必须与类名相同
    // 2. 没有返回值类型（连void都不能写）
    // 3. 在创建对象时自动调用
    public MethodTypes(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 另一个构造方法 - 展示构造方法重载
    public MethodTypes() {
        this.name = "未命名";
        this.age = 0;
    }
    
    // 实例方法（普通方法）特点：
    // 1. 可以直接访问实例变量和实例方法
    // 2. 必须通过对象调用
    // 3. 可以有返回值
    public void study() {
        System.out.println(this.name + "正在学习");
        this.takeRest(); // 可以调用其他实例方法
    }
    
    private void takeRest() {
        System.out.println(this.name + "休息一下");
    }
    
    // 静态方法（类方法）特点：
    // 1. 使用static关键字
    // 2. 只能访问静态变量和静态方法
    // 3. 可以通过类名直接调用
    public static void showSchool() {
        System.out.println("学校名称：" + school);
        // 错误：不能直接访问实例变量
        // System.out.println(name); 
    }
    
    // getter和setter方法也是实例方法的一种
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public static void main(String[] args) {
        // 使用构造方法创建对象
        MethodTypes student1 = new MethodTypes("小明", 18);
        MethodTypes student2 = new MethodTypes();
        
        // 调用实例方法
        student1.study();
        student2.study();
        
        // 调用静态方法
        MethodTypes.showSchool();
        // 也可以通过对象调用静态方法，但不推荐
        student1.showSchool();
    }
} 